查看原文
其他

【周末AI课堂】隐藏单元的设计原则(理论篇)| 机器学习你会遇到的“坑”

唐僧不用海飞丝 读芯术 2019-12-26

AI课堂开讲,就差你了!


很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!


来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!


读芯术读者交流群,请加小编微信号:zhizhizhuji。等你。后台回复“周末AI课堂”,查阅相关源代码。


全文共2316字,预计学习时长6分钟





数学准备


• non-zero-center:非零对称的函数


获得更好的优化是深度学习的核心任务之一,具体来说,就是让学习变得更容易。当我们固定好神经网络结构,在训练的过程中,要把数据本身包含的信息有效地传递给每一个参数,一方面,这与优化算法密切相关,另一方面,则需要设计更好优化的结构。


从表示学习的角度来看,神经网络前面的所有层,都可以看做获得一个更好的表示,只有最后一层将表示转化为输出,所以,神经元可以分为隐藏单元和输出单元。事实上,神经网络优化性能提升的主要来源就是这两类神经元的改变。


本文主要聚焦在隐藏单元,也就是激活函数,我们以喜闻乐见的sigmoid函数为出发点去理解激活函数的设计方法。


非零中心与梯度消失


如果神经网络中每一层都是线性变换,那么最后的变换一定是线性的,我们可以假设某个神经网络由l层构成,但每一层都只有一个神经元,同时神经元的阈值为零,最后的输出是:



激活函数重要性就体现在它的存在直接使得整个网络变为非线性的,例如sigmoid函数,将会使得最后的输出变为复杂的非线性函数,表现为多层复合函数:



使用BP算法去估计参数,假设我们的损失函数为L,学习率为1,同时根据sigmoid函数中,权重系数与输入相乘的形式,第l层的权重系数变化为:



在这里,我们将会面对非零中心带来的问题,永远是正的,而也永远是正的。


如图,sigmoid函数和其导数均为正,另一条很重要的性质是,在值较大和较小区域,sigmoid函数的导数会变得很小。


唯一决定其更新方向只有Loss对输出的偏导,但对于某一确定的数据,这一项也是常数。也就是说,在sigmoid作为激活函数的情况下,存在多个参数的情况下,权重系数的更新会全部沿着同一个方向,我们假设存在两条权重边连入到其中,另一个参数的更新也与上述情况类似。比如,我们进行两个参数的更新:

 



因为均为正,其余的条件均一样,w1和w0的更新沿着同一个方向,当我们遇到需要减小一个参数,而增大另一个参数的时候,此种性质会造成迭代的冗余。


如图,当我们需要增大w0,减小w1时,由于上一步sigmoid函数的输出永远为正,参数只能沿同一个方向更新,要么全部增大,要么全部减小,就形成了Z形折线。


在此基础上,我们所更新的第l-1层权重系数变化为:


 

注意到第一项仍然要使用链式法则,同时使用sigmoid函数性质:



需要注意到当我们对w或者x进行求导时,别忘记还有一层复合函数,第一项就可以写作:



同时,第二项也可以记为:



那么,权重系数更新为:



在这里,我们可以看到,上一层的梯度直接进入了此层的更新,我们可以将参数的更新理解为,梯度在层与层之间流动。用l-1层的参数变换除以层的参数变换,就可以反映出更新幅度的大小:



对于确定的一个数据点,如果当时,参数的更新幅度为零,也就是梯度变小了。如果我们继续向后传播,后面的层与起点的l层的比值所形成的链会越变越长,sigmoid函数的导数最大也不会超过0.25,所以比值会越变越小,参数变换幅度也会越来越小。换而言之,sigmoid函数进入的自变量太大或者太小时,随着传播,非常容易地进入“饱和区”,这就是所谓的梯度消失。


激活函数的性质


根据上述存在的问题,我们可以大概明确激活函数必须要满足的几条性质:


  • 非线性。这是万能近似定理的要求,线性单元的线性组合不会学习到非线性的表示。


  • 连续性。我们希望对于每一个输入,都有输出。当某个可能的数值在激活函数上没有定义时,这个激活函数将没有输出,这是不被允许的。注意,输出为零与没有输出是两种截然不同的情况。


  • 几乎可微。完全可微性经常被人误以为是激活函数的必要条件,因为总是要计算梯度,实际上,我们不需要保证对所有的点都存在导数,有限的几个点不存在导数仍然是可以接受的,我们会用左导数或者右导数来替代导数没有定义的点。


此外,为了更好让神经网络得到更好的优化,少部分出于获得更好的表示,我们希望激活函数还可以满足以下特质:


  • 单调性。这一点存在着一些争议,因为有些激活函数并不是单调性的,但效果却很好,一般认为,单调性的激活函数会带来更好的收敛效果。


  • 小的饱和区域,甚至不饱和。我们已经在上文中看到,大量的饱和区域会使得深层的网络参数很难得到大幅度的更新,我们希望激活函数的梯度在很小的区域内为零。除此之外,函数本身等于零的区域也要尽量少。


  • 更小的计算量。一方面,我们希望激活函数计算起来较为简单,另一方面,我们希望激活函数尽量少参数,因为激活函数每增加一个参数,整个神经网络要相应增加隐层包含神经元数量之和的参数数量,这对于优化仍然是不利的。


  • 近似线性化。在上述的过程中,我们可以看到梯度在层与层之间的流动,为了避免大的梯度和小的梯度在深层网络中传播时对优化的影响,若梯度为1,则可以避免一些麻烦,但是,完全的线性又会违反万能近似定理,所以我们希望激活函数在某个区间内保持线性。


读芯君开扒


课堂TIPS


• 在缓解梯度消失问题时,另一个想法是,我们不使用基于梯度的优化算法,而是使用二阶优化。例如在《理解优化算法》中提到的牛顿法,它是一阶信息与二阶信息的比值,从理论上这是可行的。因为函数趋于饱和时,一阶导数和二阶导数可能具备相同的变化趋势,那么比值反而恒定,但是仍然存在鞍点和计算复杂度太高的情形。


• 对激活函数的研究是神经网络的一个重要课题,我们会在下篇文中针对性详细介绍一些性质良好的激活函数。本文所讲的激活函数的性质,可以成为我们设计激活函数的指导原则,但有些原则缺乏理论支撑,仍然存在我们无法解释的情形,比如softplus函数应该比relu效果更好,但实际上却没有,在某种程度上,目前激活函数的设计原则仍然是启发式的。


留言 点赞 发个朋友圈

我们一起探讨AI落地的最后一公里


作者:唐僧不用海飞丝


如需转载,请后台留言,遵守转载规范


推荐文章阅读


【周末AI课堂 | 第三十四讲】神经网络综观(代码篇)

【周末AI课堂 | 第三十三讲】神经网络综观(理论篇)

【周末AI课堂 | 第三十二讲】从感知机到深度学习(代码篇)

【周末AI课堂 | 第三十一讲】从感知机到深度学习(理论篇)

【周末AI课堂 | 第三十讲】理解梯度下降(二)(代码篇)

【周末AI课堂 | 第二十九讲】理解梯度下降(二)(理论篇)

【周末AI课堂 | 第二十八讲】理解梯度下降(一)(代码篇)

【周末AI课堂 | 第二十七讲】理解梯度下降(一)(理论篇)

【周末AI课堂 | 第二十六讲】理解损失函数(代码篇)

【周末AI课堂 | 第二十五讲】理解损失函数(理论篇)

【周末AI课堂 | 第二十四讲】聚类的几个重要问题(代码篇)

【周末AI课堂 | 第二十三讲】聚类的几个重要问题(理论篇)

【周末AI课堂 | 第二十二讲】Boosting集成(代码篇)

【周末AI课堂 | 第二十一讲】Boosting集成(理论篇)

【周末AI课堂 | 第二十讲】bagging集成和stacking集成(代码篇)

【周末AI课堂 | 第十九讲】bagging集成和stacking集成(理论篇)

【周末AI课堂 | 第十八讲】非参模型进阶(代码篇)

【周末AI课堂 | 第十七讲】非参模型进阶(理论篇)

【周末AI课堂 | 第十六讲】非参模型初步(代码篇)

【周末AI课堂 | 第十五讲】非参模型初步(理论篇)

【周末AI课堂 | 第十四讲】基于贝叶斯推断的回归模型(代码篇)

【周末AI课堂 | 第十三讲】基于贝叶斯推断的回归模型(理论篇)

【周末AI课堂 | 第十二讲】基于贝叶斯推断的分类模型(代码篇)

【周末AI课堂 | 第十一讲】基于贝叶斯推断的分类模型(理论篇)

【周末AI课堂 | 第十讲】核技巧(代码篇)

【周末AI课堂 | 第九讲】核技巧(理论篇)

【周末AI课堂 | 第八讲】非线性降维方法(代码篇)

【周末AI课堂 | 第七讲】非线性降维方法(理论篇)

【周末AI课堂 | 第六讲】线性降维方法(代码篇)

【周末AI课堂 | 第五讲】线性降维方法(理论篇)

【周末AI课堂 | 第四讲】如何进行特征选择(代码篇)

【周末AI课堂 | 第三讲】如何进行特征选择(理论篇)

【周末AI课堂 | 第二讲】过拟合问题(代码篇)

【周末AI课堂 | 第一讲】过拟合问题(理论篇)


长按识别二维码可添加关注

读芯君爱你


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存